home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / taropyon / hewin / ccisrc / sndplay.cci < prev    next >
Text File  |  1993-11-30  |  2KB  |  95 lines

  1. /*************************************************************************
  2. *    "sndplay.cci"    : 音声データの再生
  3. *************************************************************************/
  4.  
  5.  
  6. int        CCI_sndPlay(int argc, char **argv)
  7. {
  8.     char    *fp;
  9.     char    *fdl;
  10.     char    *dlg;
  11.     char    *fn, buf[128], *dat;
  12.     int        ret, ch, mute_sw, x, y;
  13.     long    siz;
  14.  
  15.     if ( argc > 1 )
  16.     {
  17.         fn = argv[1];
  18.     } else
  19.     {
  20.         if ( (fdl = FDL_open(0)) == NULL )
  21.             return (ERR);
  22.         FDL_set_title( fdl,"SND PLAY");
  23.         FDL_set_wildcard( fdl, "*.snd");
  24.         ret = FDL_start(fdl);
  25.         fn  = FDL_get_filename(fdl);
  26.         if ( ret == NORMAL && strlen(fn) > 0 )
  27.         {
  28.             strcpy( buf, fn );
  29.             fn = buf;
  30.         } else
  31.             ret = ERR;
  32.         FDL_close(fdl);
  33.         if ( ret != NORMAL )
  34.             return (ERR);
  35.     }
  36.  
  37.     if ( (fp = FM_fopen(fn,"rb")) == NULL )
  38.     {
  39.         DLG_tmpMsgTime( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
  40.             C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
  41.             3, "file open error!! (%s)", fn );
  42.         return (ERR);
  43.     }
  44.     fseek(fp, 0, SEEK_END);
  45.     siz = ftell(fp);                    /* ファイルサイズの取得        */
  46.     rewind(fp);
  47.     if( (dat = malloc(siz)) == NULL )    /* データ読み込み領域の確保    */
  48.     {
  49.         FM_fclose(fp);
  50.         DLG_tmpMsgBox ( DLGPOS_MOS_SET_CENTER, DLGPOS_MOS_SET_CENTER,
  51.             C_MBLACK, C_DLGBASE, COLMIX(C_ERROR,C_GRAY),
  52.             "Memory allocation error!! (size %u)", siz );
  53.         return (ERR);
  54.     }
  55.     fread( dat, siz, 1, fp );
  56.     FM_fclose(fp);
  57.  
  58.     dlg = DLG_msgOpen( DLGPOS_MOS_SET_CENTER,DLGPOS_MOS_SET_CENTER,
  59.         6*40,12*6, C_MBLACK,C_DLGBASE,COLMIX(C_INFO,C_GRAY),
  60.         "SND PLAYER");
  61.  
  62.     DLG_msgSetConfig( dlg, 4, 6, 12 );
  63.     DLG_msgClear( dlg, C_HWHITE);
  64.     DLG_msgPrintf(dlg,"\r\n" );
  65.     DLG_msgPrintf(dlg,"SND DATA FILE : %s\r\n", fn );
  66.     DLG_msgPrintf(dlg,"    DATA SIZE : %8u\r\n", siz );
  67.     DLG_msgPrintf(dlg,"    BASE NOTE : %d\r\n", dat[28]&127 );
  68.  
  69.     SND_get_elevol_mute( &mute_sw );    /* ミュート状態の取得    */
  70.     mute_sw |= 1;                        /* PCM音源ミュート解除    */
  71.     SND_elevol_mute( mute_sw );            /* ミュート設定            */
  72.  
  73.     SND_pcm_abort();
  74.     SND_pcm_mode_set(1);
  75.     ch = 71;
  76.     SND_pan_set(ch,64);                            /* パンポット    */
  77.     SND_pitch_change(ch,8192);                    /* ピッチベンド    */
  78.     SND_volume_change(ch,127);                    /* ボリューム    */
  79.     SND_pcm_play(ch, dat[28] & 127, 127, dat);    /* 再生            */
  80.     while ( SND_pcm_status(ch) != 0 )
  81.     {    if ( EVT_kbhit() || EVT_mos_pget(&x,&y) )
  82.         {
  83.             DLG_msgPrintf(dlg,"\r\nAbort...\r\n" );
  84.             break;
  85.         }
  86.     }
  87.     SND_pcm_play_stop(ch);
  88.  
  89.     DLG_msgClose( dlg );
  90.  
  91.     free(dat);
  92.  
  93.     return (NORMAL);
  94. }
  95.